总结 calc 函数的使用方法、与 Sass 运算的异同和最佳实践
calc()
是一个 CSS 函数,可以使用它在声明 CSS 属性值时执行一些计算,主要适用于如下属性值:
- <length>,数字和长度单位的组合(除了百分比、时间、角度单位)
- <percentage>,数字和百分比单位的组合
- <number>,只有数字
- <angle>,数字和角度单位的组合
语法
div {
width: calc(100% - 80px);
}
calc()
函数用一个数学表达式作为它的参数,然后返回这个表达式的计算值,比如上面这个例子中,div 的宽度等于它的包含块的宽度的 100% 减去 80px,因此只要包含块的宽度发生变化,那么这个 div 的宽度也会随着变化。
这个表达式可以是任何如下操作符的组合:
表达式中的参与计算的对象可以是任意 <length>、<percentage>、<number>、<angle>,但是计算过程一定要有 意义,比如你用 calc(10px + 20deg)
,让长度单位和角度单位进行运算就完全没有意义。
但是,你可以使用 calc(20px + 50%)
,也可以使用 cacl(20vh + 30px)
。
另外,并不局限于两个对象进行运算,可以多个对象进行运算,而且可以使用 括号 来区分优先级,比如:
div {
width: calc(100% - (80px + 20vh) / 2);
}
important
+
和-
运算符的两边必须留空白,目的是避免混淆负数,比如,calc(50% -8px)
会被解析为无效表达式,因为50%
和-8px
它们之间没有运算符calc()
函数支持嵌套,但是意义不大,最终还是会被解析为普通的括号(区分优先级),比如:div {
// calc(100% - calc(80px + 20vh) / 2);
width: calc(100% - (80px + 20vh) / 2);
}
与 Sass 运算的异同点
关于 Sass 运算机制详情请看我之前写的 Sass的核心用法,下面简单来谈一下利用 calc()
函数进行数值运算和 Sass 运算的异同。
它们都支持数学运算规则,但是 cacl()
函数的功能更强大,它具有 "响应式" 的特点,可以动态修改属性取值,并且还可以结合 CSS 原生变量来使用,相对来说 Sass 中的运算就没有那么强大了。
最佳实践
搭配 CSS 变量
在 CSS 变量中,对于一个数值类型的变量是不能直接和 数值单位 一起使用的。
:root {
--size: 20;
/* 无效 */
font-size: var(--size)px;
}
想要实现上面的效果就需要利用 calc()
函数:
:root {
--size: 20;
font-size: cacl(var(--size) * 1px);
}
字体大小随视口宽度变化
主要利用的就是 vw 和 vh 单位,使用该单位的数值大小取决于视口的宽度或者高度,实际上不使用 cacl()
函数也可以让字体大小随视口宽度变化,但是利用 cacl()
可以给字体大小加上一个最低限度,相对于给一次函数 y 轴交点值不为 0。
:root {
font-size: cacl(1rem + 3vw);
}
优化绝对定位居中法
让小盒子水平垂直居中在大盒子中,可以利用 绝对定位居中法,传统方案中利用了负的外边距来调整小盒子位置。这里我们使用 cacl()
函数可以避免使用负的外边距:
.father {
width: 500px;
height: 500px;
position: relative;
.child {
width: 100px;
height: 100px;
position: absolute;
top: calc(50% - 50px);
left: calc(50% - 50px);
}
}
提高可读性
比如 width: 33.3333%
可以替换为 width: cacl(100% / 3)
,当然在 Sass 中也支持直接使用除法 width: (100% / 3)
。